//
//  MMGOAuthViewController.swift
//  MyMicroblog
//
//  Created by Mac on 17/1/6.
//  Copyright © 2017年 itcast. All rights reserved.
//

import UIKit
import SVProgressHUD

class MMGOAuthViewController: MMGBaseViewController, UIWebViewDelegate {
    // 设置授权页面
    let oauthView: UIWebView = UIWebView()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        oauthView.frame = view.frame
        view = oauthView
        oauthView.delegate = self
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "返回", style: UIBarButtonItemStyle.plain, target: self, action: #selector(close))
        
        // 在应用发布的时候,一定要注意注销账号
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "默认填充", style: .plain, target: self, action: #selector(fillAccount))
        
        loadOAuthData()
    }

    // 退出授权页面
    @objc private func close() {
        
        self.dismiss(animated: true, completion: nil)
    }
    
    // 开发者账号,便利填充
    @objc private func fillAccount() {
    
        let testString = "document.getElementById('userId').value = 'sr1991125@126.com',document.getElementById('passwd').value = 'sr19901205'"
        oauthView.stringByEvaluatingJavaScript(from: testString)
    }
    
    // 加载授权网页
    func loadOAuthData() {
        
        // 微博 OAuth 授权样式:
        //https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code
        /*
         
                        必选	     类型及范围	   说明
         client_id	    true	string	申请应用时分配的AppKey。
         redirect_uri	true	string	授权回调地址，站外应用需与设置的回调地址一致，站内应用需填写canvas page的地址。
         scope	        false	string	申请scope权限所需参数，可一次申请多个scope权限，用逗号分隔。使用文档
         state	        false	string	用于保持请求和回调的状态，在回调时，会在Query Parameter中回传该参数。开发者可以用这个参数验证请求有效性，也可以记录用户请求授权页前的位置。这个参数可用于防止跨站请求伪造（CSRF）攻击
         display	    false	string	授权页面的终端类型，取值见下面的说明。
         forcelogin	    false	boolean	是否强制用户重新登录，true：是，false：否。默认false。
         language	    false	string	授权页语言，缺省为中文简体版，en为英文版。英文版测试中，开发者任何意见可反馈至 @微博API
         */
        //同意授权后会重定向
        //http://www.example.com/response&code=CODE
        
        let urlString:String = urlOAuth + "client_id=" + client_id + "&redirect_uri=" + redirect_uri
        let url:URL = URL(string: urlString)!
        let request:URLRequest = URLRequest(url: url)
        oauthView.loadRequest(request)
    }
    
    
    // 在获取页面中截取 code
    /*
     返回值字段	字段类型	字段说明
     code	string	用于第二步调用oauth2/access_token接口，获取授权后的access token。
     state	string	如果传递参数，会回传该参数。
     */
    // 授权页面加载时,获取用户信息
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        print(request)
        // 获取请求信息的网络路径
        let urlString:String = request.url?.absoluteString ?? ""
        let flag = "code="
        // 判断字符串中是否包含 code 标记,如果包含,执行截取操作
        if urlString.contains(flag) {
        
            let query = request.url?.query ?? ""
            let index: String.Index = (query.range(of: flag)!.lowerBound)
            let code = query.substring(from: index).substring(from: flag.endIndex)
            // 根据截取的 code 值,获取用户信息
            MMGUserAccountViewModel.shared.loadUserToken(code: code) {(isSucced: Bool) in
                if isSucced {
                    // 获取用户信息成功,发送切换控制器的消息
                    NotificationCenter.default.post(name: Notification.Name(kChoseRootViewController), object: "Welcome")
                }else{
                    // 获取用户信息失败,显示失败状态
                    SVProgressHUD.showError(withStatus: "请检查网络状态哦,亲亲")
                }
            }
            // 截取到 code 之后,不再为页面加载多余网页
            return false
        }
        return true
    }
    
    // 页面消失,关闭加载动画
    override func viewDidDisappear(_ animated: Bool) {
        
        SVProgressHUD.dismiss()
    }
}


/******************* 添加分类,在分类中执行独立的代理方法 *******************/

extension MMGOAuthViewController {

    // 页面加载时显示加载动画
    func webViewDidStartLoad(_ webView: UIWebView) {
        
        SVProgressHUD.show()
    }
    
    // 页面接在完毕关闭加载动画
    func webViewDidFinishLoad(_ webView: UIWebView) {
        
        SVProgressHUD.dismiss()
    }
    
}
